#ifndef SERVIDOR_CPP
#define SERVIDOR_CPP
#include <math.h>
#include <vector>
#include <cstdlib>
#include <time.h>
#include "individuo.cpp"
#include <iostream>
#include <sys/time.h>

using namespace std;

#define OCUPADO 1
#define OCIOSO 0


class Servidor{
private:
	Individuo individuoAtual;

	int status;
	float mi;
	float tempoOcupadoTotal;
	float initTempoOcupado;
	bool flagAtualizarRo;
	unsigned long semente;
	struct drand48_data bufferGeradorAleatorio;
public:
	Servidor(float mi): mi(mi)
	{
        tempoOcupadoTotal = 0;
        initTempoOcupado = 0;
		status = OCIOSO;
		flagAtualizarRo = false;
		initSemente();

	}
	~Servidor(){
	}
	void initSemente()
	{
		struct timeval temp;
		gettimeofday(&temp, NULL);
		semente = temp.tv_usec;
		srand48_r(semente, &bufferGeradorAleatorio);
	}
	float geraServico()
	{
		double randomico = 0;

			while (randomico == 0 || randomico == 1)
			{
				drand48_r(&bufferGeradorAleatorio, &randomico);
			}
		return (-1) * ((log (1-randomico))/mi);
	}
	int getStatus()
	{
		return status;
	}

	bool getAtualizarRo()
	{
		return flagAtualizarRo;
	}

	void setStatus(int i)
	{
		status = i;
		flagAtualizarRo = true;

	}
	void atualizarRo(float const &tempoAtual)//atualiza a utilizacao do servidor
	{
		if(status == OCUPADO) initTempoOcupado = tempoAtual;

		else
		{
			tempoOcupadoTotal += tempoAtual - initTempoOcupado;
			initTempoOcupado = 0;
		}
		flagAtualizarRo = false;
	}
	float getRo(float const &tempoAtual)
	{
		if(tempoAtual == 0) return 0.0;
		if(initTempoOcupado>0 && status == OCUPADO)
		{
			tempoOcupadoTotal += tempoAtual - initTempoOcupado;
			initTempoOcupado = tempoAtual;
		}
		return tempoOcupadoTotal * 100.0 / tempoAtual;
	}
	Individuo getIndividuoAtual()
	{
		return individuoAtual;
	}

	void setIndividuoAtual(Individuo i)
	{
		individuoAtual = i;
	}
};
#endif
